#include "Moto.h"
#include "../lib/basicas.h"

void mover_moto(int x_actual, int y_actual, int ultimo_mov, int id_moto) {
    
    int random_movimiento = 0;
    int r_mov;
    int i = 0;
    int movio = 0;
    int posicion_vector_moto = id_moto - 1;

    int LOCAL_ARRIBA = 1, LOCAL_ABAJO = 1, LOCAL_IZQ = 1, LOCAL_DER = 1;
		int espera_proximo_movimiento = 1;
    /* printf(" X:%d Y:%d ID:%d | %d %d \n", x_actual, y_actual, id_moto, tabla_thr[posicion_vector_moto].posX, tabla_thr[posicion_vector_moto].posY); */

		/*-- Limpio pantalla --*/
		system("clear");  

    while(espera_proximo_movimiento){

    		/*-- Genero Random --*/
    		srand((unsigned)time(0));
				random_movimiento = (rand() % 4)+1;

		    switch(random_movimiento){
		    		case ARRIBA:
							if(LOCAL_ARRIBA == 1 && (x_actual > 0 && coordenadasLibres(x_actual -1, y_actual, id_moto, TRUE) == TRUE) ){
					      actualizar_matriz(x_actual -1, y_actual, id_moto);
				        tabla_thr[posicion_vector_moto].posX = x_actual-1;
				        tabla_thr[posicion_vector_moto].posY = y_actual;
				        sprintf(logMessageAux, "ARRIBA: Moto %d (%d,%d)->(%d,%d)", id_moto, x_actual,y_actual,x_actual-1, y_actual);
								setLog(logMessageAux, INFO, NOMBREPROCESO);
				        sleep(TIME_SLEEP);
				        espera_proximo_movimiento = 0;
							}else{
								LOCAL_ARRIBA = 0;
							}
							break;
													    
		    		case ABAJO:
		    			if(LOCAL_ABAJO == 1 && (x_actual < ALTO_MAPA-1 && coordenadasLibres(x_actual+1, y_actual, id_moto, TRUE) == TRUE )){
			      		actualizar_matriz(x_actual+1, y_actual, id_moto);
		        		tabla_thr[posicion_vector_moto].posX = x_actual+1;
		        		tabla_thr[posicion_vector_moto].posY = y_actual;
				        sprintf(logMessageAux, "ABAJO: Moto %d (%d,%d)->(%d,%d)", id_moto, x_actual,y_actual,x_actual+1, y_actual);
								setLog(logMessageAux, INFO, NOMBREPROCESO);
		        		sleep(TIME_SLEEP);
		        		espera_proximo_movimiento = 0;
							}else{
								/* printf("LOCAL_ABAJO = %d\n", LOCAL_ABAJO); */
								LOCAL_ABAJO = 0;
							}
							break;		
							    			
		    		case IZQUIERDA:
					   	if(LOCAL_IZQ == 1 && (y_actual > 0 && coordenadasLibres(x_actual, y_actual-1, id_moto, TRUE) == TRUE)){
						      actualizar_matriz(x_actual, y_actual-1, id_moto);
					        tabla_thr[posicion_vector_moto].posX = x_actual;
					        tabla_thr[posicion_vector_moto].posY = y_actual-1;
					        sprintf(logMessageAux, "IZQUIERDA: Moto %d (%d,%d)->(%d,%d)", id_moto, x_actual,y_actual,x_actual, y_actual-1);
									setLog(logMessageAux, INFO, NOMBREPROCESO);
					        espera_proximo_movimiento = 0;
					    		sleep(TIME_SLEEP);
					    }else{
					    	/* printf("LOCAL_IZQ = %d\n",LOCAL_IZQ); */
					    	LOCAL_IZQ = 0;
					    }

					    break;
					    
		    		case DERECHA:
		    			if(LOCAL_DER == 1 && (y_actual < ANCHO_MAPA - 1 && coordenadasLibres(x_actual, y_actual+1, id_moto, TRUE) == TRUE)){
			      		actualizar_matriz(x_actual, y_actual+1, id_moto);
		        		tabla_thr[posicion_vector_moto].posX = x_actual;
		        		tabla_thr[posicion_vector_moto].posY = y_actual+1;
		        		sprintf(logMessageAux, "DERECHA: Moto %d (%d,%d)->(%d,%d)", id_moto, x_actual,y_actual,x_actual, y_actual+1);
								setLog(logMessageAux, INFO, NOMBREPROCESO);
		        		espera_proximo_movimiento = 0;
								sleep(TIME_SLEEP);
							}else{
								/* printf("LOCAL_DER = %d\n",LOCAL_DER); */
								LOCAL_DER = 0;
							}
							break;
		    }

		    /* printf(" Salgo del Whila AR:%d AB:%d IZ:%d DE:%d\n", LOCAL_ARRIBA, LOCAL_ABAJO, LOCAL_IZQ, LOCAL_DER); */

		    /*-- Sino pudo moverse hacia ningun lado, mato la moto --*/
		    if(LOCAL_ABAJO == 0 && LOCAL_ARRIBA == 0 && LOCAL_DER == 0 && LOCAL_IZQ ==0){
		    		
		    		int x,y;
		    		
		    		espera_proximo_movimiento = 0;
		    		/* tabla_thr[posicion_vector_moto].estado = 0; */
            printf("Limpio rastros de moto: %d\n", id_moto);
            limpiar_rastros_moto(id_moto);
            pintar_mapa();
            /* printf("Haciendo el pthread_exit de moto %d\n", id_moto); */
            /* printf("Reinicio Moto: %d\n", id_moto); */
 						sprintf(logMessageAux, "Reinicio Moto %d", id_moto);
						setLog(logMessageAux, INFO, NOMBREPROCESO);
            /*-- TODO: Reinicio de moto --*/   
            
						do{
							srand((unsigned)time(0)+3);
							x = rand() % ALTO_MAPA;
							
							srand((unsigned)time(0)+7);
							y = rand() % ANCHO_MAPA;
						}while(coordenadasLibres(x,y,id_moto, FALSE)!= 0);
						
						tabla_thr[posicion_vector_moto].posX = x;
						tabla_thr[posicion_vector_moto].posY = y; 
						actualizar_matriz(tabla_thr[posicion_vector_moto].posX, tabla_thr[posicion_vector_moto].posY, tabla_thr[posicion_vector_moto].id);
						sprintf(logMessageAux, "Inicializo Moto %d en vector: posicion (%d,%d)", id_moto, tabla_thr[posicion_vector_moto].posX, tabla_thr[posicion_vector_moto].posY);
						setLog(logMessageAux, INFO, NOMBREPROCESO);   
            
            sleep(2);
            //pthread_exit(NULL);								
		    }
    }
    pintar_mapa();
		sleep(TIME_SLEEP);
}
